
Ethan Collins
Pattern Recognition Specialist

Panduan ini memberikan tutorial langkah demi langkah tentang cara melewati CAPTCHA dan halaman Challenge AWS WAF menggunakan PHP dan API CapSolver. Kami menjelaskan logika untuk mendeteksi respons CAPTCHA (HTTP 405) dan Challenge (HTTP 202), mengekstrak parameter yang diperlukan, dan menggunakan cookie aws-waf-token yang dihasilkan untuk mengakses sumber daya yang dilindungi.
Selamat datang di panduan lengkap ini di mana kita akan menjelajahi dunia CAPTCHA AWS dan bagaimana menerapkan solver PHP untuknya. Bagi pengembang dan penjelajah web, menghadapi CAPTCHA bisa menjadi hambatan signifikan, tetapi dengan alat yang tepat, ini menjadi tugas yang dapat dikelola.
AWS WAF (Web Application Firewall) adalah layanan keamanan yang membantu melindungi aplikasi web dari eksploit web umum. Layanan ini menawarkan dua tindakan utama untuk memverifikasi bahwa permintaan berasal dari pengguna manusia yang sah, bukan bot: CAPTCHA dan Challenge.
| Aksi | Tujuan | Kode Status HTTP | Solusi yang Diperlukan |
|---|---|---|---|
| Challenge | Menjalankan verifikasi latar belakang untuk memastikan sesi klien adalah browser standar. | 202 Accepted |
Membutuhkan penyelesaian tantangan JavaScript untuk mendapatkan token. |
| CAPTCHA | Meminta pengguna akhir untuk menyelesaikan teka-teki visual untuk membuktikan mereka manusia. | 405 Method Not Allowed |
Membutuhkan penyelesaian CAPTCHA visual, yang melibatkan ekstraksi parameter spesifik dari halaman. |
Setelah CAPTCHA atau Challenge berhasil diselesaikan, AWS WAF mengeluarkan token yang valid, yang dikembalikan sebagai nilai dari cookie bernama aws-waf-token. Cookie ini harus disertakan dalam permintaan berikutnya untuk melewati perlindungan WAF.
CapSolver menyediakan solusi API yang kuat untuk menangani Challenge latar belakang dan CAPTCHA visual yang ditampilkan oleh AWS WAF. Panduan ini fokus pada penggunaan perpustakaan cURL PHP untuk menerapkan logika yang diperlukan.
Inti dari solusi kita melibatkan dua pemanggilan API utama ke CapSolver: createTask untuk mengirim CAPTCHA/Challenge dan getTaskResult untuk mengambil solusinya.
<?php
// --- Konfigurasi ---
$PROXY = "http://username:password@host:port"; // OPSIONAL: Ganti dengan detail proxy Anda (misalnya, untuk AntiAwsWafTask)
$PAGE_URL = "https://norway-meetup.aws.wslab.no/"; // Ganti dengan URL target yang dilindungi AWS WAF
$CLIENT_KEY = "YourPayPerUsage"; // Ganti dengan kunci API CAPSOLVER Anda
/**
* Mengirim tugas ke API CapSolver.
* @param array $payload Payload tugas yang berisi tipe dan parameter.
* @return array Respons API, termasuk taskId.
*/
function createTask($payload) {
global $CLIENT_KEY;
$ch = curl_init();
echo("Membuat tugas...\n");
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/createTask');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'task' => $payload]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
/**
* Memeriksa API CapSolver untuk hasil tugas.
* @param string $taskId ID tugas yang akan diperiksa.
* @return array Respons API yang berisi solusi.
*/
function getTaskResult($taskId) {
global $CLIENT_KEY;
do {
echo("Menunggu solusi...\n");
sleep(1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/getTaskResult');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'taskId' => $taskId]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (isset($data['status']) && $data['status'] == "ready") {
return $data;
}
// Menangani kesalahan potensial dari getTaskResult
if (isset($data['errorId']) && $data['errorId'] != 0) {
echo("Kesalahan mengambil hasil tugas: " . $data['errorDescription'] . "\n");
return null;
}
} while(true);
}
/**
* Menyelesaikan Challenge atau Captcha AWS WAF menggunakan tipe tugas yang sesuai.
* @param string $taskType Tipe tugas CapSolver (AntiAwsWafTask atau AwsCaptchaTask).
* @param array $params Parameter yang diperlukan untuk tugas.
* @return string|null Nilai cookie aws-waf-token atau null jika gagal.
*/
function solveAwsWaf($taskType, $params) {
global $PAGE_URL, $PROXY;
$payload = [
'type' => $taskType,
'websiteURL' => $PAGE_URL,
'proxy' => $PROXY,
];
// Gabungkan parameter spesifik untuk tugas
$payload = array_merge($payload, $params);
// Bersihkan nilai kosong untuk permintaan yang lebih bersih
$payload = array_filter($payload, function($value) {
return $value !== "" && $value !== null;
});
$taskData = createTask($payload);
if (isset($taskData['taskId'])) {
$result = getTaskResult($taskData['taskId']);
if ($result && isset($result['solution']['cookie'])) {
return $result['solution']['cookie'];
}
}
return null;
}
Logika utama melibatkan membuat permintaan awal ke halaman yang dilindungi dan memeriksa kode HTTP untuk menentukan apakah Challenge (202) atau CAPTCHA (405) diperlukan. Kami kemudian menggunakan ekspresi reguler untuk mengekstrak parameter yang diperlukan dari konten HTML respons.
// --- Logika Eksekusi Utama ---
// 1. Permintaan awal ke halaman yang dilindungi
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$cookie = null;
echo("Kode HTTP Awal: " . $httpCode . "\n");
if ($httpCode == 202) {
// --- Penanganan Challenge (202) ---
echo("Challenge terdeteksi (Kode HTTP 202). Mengekstrak parameter...\n");
// Ekstrak URL challenge.js
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
if ($awsChallengeJS) {
$params = ['awsChallengeJS' => $awsChallengeJS];
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("Kesalahan: awsChallengeJS tidak ditemukan untuk Challenge.\n");
}
} elseif ($httpCode == 405) {
// --- Penanganan CAPTCHA (405) ---
echo("CAPTCHA terdeteksi (Kode HTTP 405). Mengekstrak parameter...\n");
// Ekstrak parameter dari konten halaman
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
preg_match('/"key":"(.*?)"/', $response, $matches);
$awsKey = $matches[1] ?? null;
preg_match('/"iv":"(.*?)"/', $response, $matches);
$awsIv = $matches[1] ?? null;
preg_match('/"context":"(.*?)"/', $response, $matches);
$awsContext = $matches[1] ?? null;
if ($awsKey && $awsIv && $awsContext) {
$params = [
'awsKey' => $awsKey,
'awsIv' => $awsIv,
'awsContext' => $awsContext,
'awsChallengeJS' => $awsChallengeJS // Opsional tetapi disarankan
];
// Catatan: Tipe tugas untuk CAPTCHA visual biasanya masih AntiAwsWafTask,
// tetapi parameter yang dikirim menentukan jenis solusi pada sisi CapSolver.
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("Kesalahan: Parameter key, iv, atau context tidak ditemukan untuk CAPTCHA.\n");
}
}
// 3. Gunakan token untuk mengakses sumber daya yang dilindungi
if ($cookie) {
echo("Berhasil mendapatkan nilai cookie aws-waf-token. Membuat permintaan akhir...\n");
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// Atur cookie aws-waf-token
curl_setopt($ch, CURLOPT_COOKIE, "aws-waf-token=" . $cookie);
$finalResponse = curl_exec($ch);
curl_close($ch);
echo "\n--- Konten Halaman Akhir ---\n";
echo $finalResponse;
echo "\n--------------------------\n";
} else {
echo("Gagal menyelesaikan Challenge/CAPTCHA AWS WAF.\n");
}
?>
Kode asli menggunakan fungsi terpisah (solveAwsChallenge, solveAwsCaptcha) dan penamaan parameter yang sedikit tidak konsisten (key, iv, context vs. awsKey, awsIv, awsContext). Kode yang dioptimalkan menyederhanakan ini menjadi satu fungsi solveAwsWaf, memastikan konsistensi dengan dokumentasi API CapSolver terbaru untuk menyelesaikan AWS WAF. Pendekatan ini lebih modular dan lebih mudah dipelihara.
Logika ini sangat efektif untuk tugas penjelajahan web dan otomatisasi. Untuk mereka yang bekerja dalam bahasa lain, CapSolver juga menyediakan panduan seperti "Cara Menyelesaikan AWS Captcha / Challenge dengan Python" [https://www.capsolver.com/blog/how-to-solve-aws-captcha-challenge-with-python] yang mengikuti pola API yang sama.
Mekanisme Challenge dan CAPTCHA AWS WAF adalah penghalang anti-bot yang efektif, tetapi bukan tidak terdapatkan. Dengan menerapkan logika deteksi dan penyelesaian yang kuat dalam PHP, pengembang dapat memperoleh nilai aws-waf-token yang diperlukan untuk melanjutkan tugas penjelajahan web atau otomatisasi tanpa gangguan. Kuncinya adalah mengidentifikasi tindakan WAF yang tepat melalui kode status HTTP dan mengekstrak parameter yang diperlukan dari sumber halaman secara akurat.
aws-waf-token.AntiAwsWafTask menangani penyelesaian Challenge dan CAPTCHA, dengan parameter yang diperlukan menentukan solusi spesifik.preg_match penting untuk mengekstrak parameter dinamis seperti awsChallengeJS, awsKey, awsIv, dan awsContext dari sumber HTML.A: Kode status HTTP adalah indikator yang paling andal untuk jenis tindakan WAF yang diperlukan. Kode status 202 Accepted menunjukkan bahwa Challenge aktif, yang membutuhkan parameter minimal. Kode status 405 Method Not Allowed menunjukkan bahwa CAPTCHA visual aktif, yang membutuhkan parameter spesifik (key, iv, context) yang diekstrak dari variabel JavaScript halaman.
AntiAwsWafTask dan AntiAwsWafTaskProxyLess?A: Kedua tipe tugas ini dirancang untuk menyelesaikan tantangan AWS WAF. Perbedaan utamanya adalah kebutuhan proxy. AntiAwsWafTask memerlukan Anda untuk menyediakan proxy sendiri dalam payload permintaan. AntiAwsWafTaskProxyLess tidak memerlukan proxy, karena CapSolver menangani penggunaan proxy secara internal. Menggunakan proxy sering direkomendasikan untuk penjelajahan web skala besar untuk menjaga anonimitas dan menghindari pemblokiran IP.
key, iv, atau context. Apa yang harus saya lakukan?A: Parameter ini dibuat secara dinamis dan disisipkan dalam sumber HTML, biasanya dalam tag <script> atau bidang input tersembunyi. Jika preg_match gagal, kemungkinan besar karena perubahan dalam implementasi WAF situs target. Anda harus memeriksa sumber HTML terbaru dari halaman yang diblokir untuk memperbarui ekspresi reguler Anda.
A: Menyelesaikan tantangan AWS WAF secara manual sangat sulit dan tidak praktis untuk otomatisasi. Tantangan memerlukan eksekusi JavaScript yang kompleks dan terenkripsi, sedangkan CAPTCHA memerlukan teka-teki pengenalan gambar. Layanan pihak ketiga seperti CapSolver menggunakan AI canggih dan infrastruktur skala besar untuk menyelesaikan tantangan ini secara real-time, membuat otomatisasi mungkin. Membangun solver internal untuk setiap jenis CAPTCHA umumnya tidak efektif secara biaya atau andal.
aws-waf-token berlaku?A: Periode validitas cookie aws-waf-token ditentukan oleh konfigurasi AWS WAF dari situs web yang dilindungi, tetapi biasanya sekitar 10-30 menit. Setelah token kedaluwarsa, Anda perlu mengulangi proses penyelesaian (permintaan awal, deteksi, dan pengiriman tugas) untuk memperoleh token baru.
Selesaikan CAPTCHA AWS WAF dalam pengambilan data web dengan CapSolver. Tingkatkan efisiensi, selesaikan tantangan, dan pastikan data mengalir secara mulus.

Menguasai penyelesaian tantangan CAPTCHA AWS WAF Amazon dalam otomatisasi browser dengan strategi ahli. Pelajari cara mengintegrasikan CapSolver untuk alur kerja otomatisasi yang mulus dan efisien. Panduan ini mencakup solusi berbasis token dan berbasis klasifikasi.
